トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     Function.call について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
Åê¹ÆNo.40975
投稿日時: 2008-12-9 9:52
半人前
居住地: 主に福岡へ出没
投稿: 38
使用環境:
【WinXPAS2.0】
【Win7:FlashCS4:AS3.0】
エディター:FlashDevelop
Function.call について
いつも勉強させてもらっています。
今回as2.0のリファレンスに気になるものがあったので試してみました。

function myObject() {
}
function myMethod(obj) {
    trace("this == obj? " + (this == obj));
}
var obj:Object = new myObject();
myMethod.call(obj, obj);//A
myMethod(obj)//B

B が myMethod.call(null, obj); と同じ処理だ、というところまでは辿り着いたのですが
A が true を返し B が false を返す違いがよく理解できません。
たぶんアクセス経路(参照先?)が違うのかなと思うのですが、その道順が描けません。
私の頭の中ではどちらも同じ目的地に行こうとしています……。

書きながらも考えているのですが、こんがらがってきました。
どちらも obj は渡していますよね。ん?obj 自身に目的地を設定しているのが A で
B の目的地は myMethod() だということでしょうか。
ひろゆき
Åê¹ÆNo.40976
投稿日時: 2008-12-9 10:43
ちょんまげら
居住地: 大阪密林
投稿: 3702
使用環境:
10.3.9/10.6.2

CS3/CS4 Pro
Flex 2/3 SDK
Pro8.0
Pro7.2

FlashPlayer
7.0r24/8.0r24/9.0r115/10.0r45
Safari 1.3.2/4.0.4
Firefox 2.0.0.20/3.5.7

MacOS 9.2.2
Flash 4/5
Re: Function.call について
引用:
kazurasakaさんは書きました:
B が myMethod.call(null, obj); と同じ処理だ、というところまでは辿り着いたのですが

関数内でのthis, obj がそれぞれ何を指しているのか、traceしてみては?
function myObject() {
}
function myMethod(obj) {
	trace(this);
	trace(obj);
	trace("this == obj? " + (this == obj));
}
var obj:Object = new myObject();
myMethod(obj);	//A
myMethod.call(obj,  obj);	//B
myMethod.call(this, obj);	//C

Bは、myMethod.call(this, obj) と同じだと思いますけど。


----------------
質問する際は、回答者に具体的な情報を与えてくださいなのニャ!

野中文雄
Åê¹ÆNo.40977
投稿日時: 2008-12-9 11:04
ちょんまげら
居住地: 東京
投稿: 4247
使用環境:
CS4 .4.11 Vista Home Premium (SP1)
Re: Function.call について
スクリプトに以下の修正を加えたうえで、CとDの[出力]結果も併せてご参照ください。
引用:
kazurasakaさんは書きました:
// function myObject() {
// }
function myMethod(obj) {
	trace("this == obj? "+(this == obj));
	trace("this = "+this+", argument = "+obj);
}
// var obj:Object = new myObject();
var obj:MovieClip = createEmptyMovieClip("my_mc", 1);
myMethod.call(obj, obj);  //A
myMethod(obj);  //B
myMethod.call(obj, "arg");  //C
// [追記] Dはつぎのように記述した方が適切でした。
// myMethod(obj);  //D: もとの記述
myMethod("arg");  //D: 修正した記述

B が myMethod.call(null, obj); と同じ処理だ、というところまでは辿り着いたのですが
A が true を返し B が false を返す違いがよく理解できません。

なお、つぎのEのステートメントを加えれば、「B が myMethod.call(null, obj); と同じ処理」ではないことが確かめられます。
myMethod.call(null, "arg");  //E


----------------
 

Åê¹ÆNo.40978
投稿日時: 2008-12-9 11:48
半人前
居住地: 主に福岡へ出没
投稿: 38
使用環境:
【WinXPAS2.0】
【Win7:FlashCS4:AS3.0】
エディター:FlashDevelop
Re: Function.call について
返信ありがとうございます。
ひろゆきさんと野中さんの助言を受けて下記コードを試してみました。

function myMethod(obj) {
	trace("this == obj? "+(this == obj));
	trace("this = "+this+", argument = "+obj);
}
// var obj:Object = new myObject();
var obj:MovieClip = createEmptyMovieClip("my_mc", 1);
myMethod.call(obj, obj);  //A
//myMethod(obj);  //B
myMethod.call(obj, "arg");  //C
myMethod(obj);  //D
myMethod.call(null, "arg");  //E
myMethod.call(this,obj) //F
※BとDは重複していた為Dを残してあります。

結果
//A
this == obj? true
this = _level0.my_mc, argument = _level0.my_mc
//C
this == obj? false
this = _level0.my_mc, argument = arg
//D
this == obj? false
this = _level0, argument = _level0.my_mc
//E
this == obj? false
this = undefined, argument = arg
//F
this == obj? false
this = _level0, argument = _level0.my_mc


まだ血肉にはなっていませんが、なんとなく解りました。
Bは「同じ処理」ではなく「false という結果が同じ」ということですね。

ActionScript 2.0リファレンス引用:
関数をオブジェクトのメソッドとして呼び出さずに通常の関数として呼び出すには、thisObject パラメータに値 null を渡します。
たとえば、次の 2 つの関数呼び出しは同じです。

Math.sin(Math.PI / 4)
Math.sin.call(null, Math.PI / 4)

「関数呼び出しは同じ」という記述で勘違いしたようです。
勘違いのままでいるところでした。
ありがとうございました。
野中文雄
Åê¹ÆNo.40979
投稿日時: 2008-12-9 12:10
ちょんまげら
居住地: 東京
投稿: 4247
使用環境:
CS4 .4.11 Vista Home Premium (SP1)
Re: Function.call について
それでは、もう少し補足します。以下の追加テストのA'とC'の結果は、それぞれA、Cと同じです。逆にいえば、Function.call()メソッドは、オブジェクトに定義されたメソッドと同じ呼出し結果を得るために用いられます。

参考:「Buttonのthis
引用:
kazurasakaさんは書きました:
function myMethod(obj) {
	trace("this == obj? "+(this == obj));
	trace("this = "+this+", argument = "+obj);
}
// var obj:Object = new myObject();
var obj:MovieClip = createEmptyMovieClip("my_mc", 1);
myMethod.call(obj, obj);  //A
//myMethod(obj);  //B
myMethod.call(obj, "arg");  //C
// 追加テスト
obj.myMethod = myMethod;  // オブジェクトにメソッドを設定
obj.myMethod(obj);  //A'
obj.myMethod("arg");  //C'

...[中略]...
まだ血肉にはなっていませんが、なんとなく解りました。

Dは、以下のようにすべきでしたね(先の回答には[追記]で修正を加えました)。
myMethod("arg");  //D

引用:
※BとDは重複していた為Dを残してあります。


----------------
 

Åê¹ÆNo.41003
投稿日時: 2008-12-12 8:58
半人前
居住地: 主に福岡へ出没
投稿: 38
使用環境:
【WinXPAS2.0】
【Win7:FlashCS4:AS3.0】
エディター:FlashDevelop
Re: Function.call について
野中さん、返信ありがとうございます。

今、少々時間が取り難いので、落ち着いた後に試して追記したいと思います。
まずはお礼まで。ありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops